package com.excellent.upLoad.service;

import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * @author xinang
 * @date 2020-02-24 10:05
 */
@Service
public class UploadService {
    // Arrays.asList(“”， “”） 可以初始化一个常量的字符串数组
    private static final List<String> CONTENT_TYPES = Arrays.asList("image/jpeg", "image/gif", "application/x-png", "image/png");

    @Value("${imgs.url}")
    private String IMG_URL;

    @Value("${imgs.localPath}")
    private String LOCAL_IMGS_SAVE_PATH;
    //日志输出文件
    private static final Logger LOGGER = LoggerFactory.getLogger(UploadService.class);

    // 01. 注入FastDFS 客户端
    @Autowired
    private FastFileStorageClient storageClient;

    /**
     * 上传图片到 FastDFS
     * @param file
     * @return
     */
    public String upload(MultipartFile file) {
        // 01. 校验文件的类型和内容
        if (checkFile(file)){ return null;}
        try {
            // 获取文件的扩展名
            String ext = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
            // 上传并保存图片，参数：1-上传的文件流 2-文件的大小 3-文件的后缀 4-文件的元数据信息(可以不管他)
            StorePath storePath = this.storageClient.uploadFile(file.getInputStream(), file.getSize(), ext, null);
            LOGGER.info("带分组的路径：{}, 不带分组的路径：{}", storePath.getFullPath(), storePath.getPath());
            return IMG_URL + storePath.getFullPath();
        } catch (IOException e) {
            LOGGER.info("服务器写入文件错误：{}", file.getOriginalFilename());
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 本地（Windows/Linux）上传图片
     * @param file
     * @return
     */
    public String uploadLocal(MultipartFile file) {
        // 01. 校验文件的类型和内容
        if (checkFile(file)){ return null;}
        try {
            // 02. 保存到本地服务器
            file.transferTo(new File(LOCAL_IMGS_SAVE_PATH + file.getOriginalFilename()));
            // 03. 生成url地址，返回【首先需要明白如何通过浏览器访问一个图片】
            return IMG_URL + file.getOriginalFilename();
        } catch (IOException e) {
            LOGGER.info("服务器写入文件错误：{}", file.getOriginalFilename());
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 校验文件类型和文件内容
     * @param file
     * @return
     */
    private boolean checkFile(MultipartFile file) {
        // 校验文件类型
        String contentType = file.getContentType();
        if (!CONTENT_TYPES.contains(contentType)){
            // 文件类型不合法，直接返回null
            LOGGER.info("文件类型：{}； 文件类型不合法：{}", contentType, file.getOriginalFilename());
            return true;
        }

        // 校验文件内容
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            if (bufferedImage == null){
                LOGGER.info("文件内容不合法：{}", file.getOriginalFilename());
                return true;
            }
        } catch (IOException e) {
            LOGGER.info("服务器读取文件错误：{}", file.getOriginalFilename());
            e.printStackTrace();
        }
        return false;
    }

}
